package sys

import (
	"fmt"
	"github.com/spf13/viper"
	"gorm.io/gorm/schema"
	"path/filepath"
	"sync"

	"github.com/glebarez/sqlite" // 纯 Go 实现，无 CGO 依赖
	"gorm.io/gorm"
)

var (
	// 单例 DB 实例
	sqliteDB *gorm.DB
	once     sync.Once
	initErr  error
)

// GetDBInstance 获取全局唯一的数据库实例（线程安全）
func DbIns() *gorm.DB {
	once.Do(func() {
		dbPath := filepath.Join(RootPath(), "/common/config", viper.GetString("tools.db"))
		// 初始化数据库连接
		sqliteDB, initErr = gorm.Open(sqlite.Open(dbPath), &gorm.Config{
			//Logger: logger.Default.LogMode(logger.Info), // 开启 SQL 日志
		})
		if initErr != nil {
			panic(initErr)
		}

		// 获取底层连接池配置
		sqlDB, _ := sqliteDB.DB()

		// 优化 SQLite 连接池（关键！）
		sqlDB.SetMaxIdleConns(2)    // 空闲连接数（建议 1-2）
		sqlDB.SetMaxOpenConns(1)    // 最大连接数（SQLite 写操作需串行）
		sqlDB.SetConnMaxLifetime(0) // 连接永不过期

		// 禁用表名复数
		sqliteDB.NamingStrategy = schema.NamingStrategy{
			SingularTable: true,
		}
	})

	if initErr != nil {
		panic(fmt.Sprintf("数据库初始化失败: %v", initErr))
	}
	return sqliteDB
}

// CloseDB 关闭数据库连接（程序退出时调用）
func CloseDB() {
	if sqliteDB != nil {
		if rawDB, err := sqliteDB.DB(); err == nil {
			rawDB.Close()
		}
	}
}
